package com.czg.jsonschema2lombokpojo.model;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

import com.fasterxml.jackson.databind.JsonNode;
import com.sun.codemodel.JType;

/**
 * 保存枚举类型的有效定义。
 * <p>
 *枚举的定义可由以下方式决定：
 * "enum" （JSON-Schema）
 *“enum”和“javaEnums”（JSON-Schema + jsonschema2pojo扩展）
 *“enum”和“javaEnumNames”（JSON-Schema + jsonschema2pojo扩展）
 */
public class EnumDefinition {
    private final JType backingType;
    private final ArrayList<EnumValueDefinition> enumValues;
    private final String nodeName;
    private final JsonNode enumNode;
    private final EnumDefinitionExtensionType type;

    public EnumDefinition(String nodeName,
                          JsonNode enumNode,
                          JType backingType,
                          ArrayList<EnumValueDefinition> enumValues,
                          EnumDefinitionExtensionType type) {
        this.nodeName = nodeName;
        this.enumNode = enumNode;
        this.backingType = backingType;
        this.enumValues = enumValues;
        this.type = type;
    }

    public EnumDefinition(EnumDefinition enumDefinition) {
        this(enumDefinition, enumDefinition.enumValues);
    }

    public EnumDefinition(EnumDefinition enumDefinition, ArrayList<EnumValueDefinition> enumValueDefinitions) {
        this(enumDefinition.nodeName,
                enumDefinition.enumNode,
                enumDefinition.backingType,
                enumValueDefinitions,
                enumDefinition.type);
    }

    public JType getBackingType() {
        return backingType;
    }

    public JsonNode getEnumNode() {
        return enumNode;
    }

    public String getNodeName() {
        return nodeName;
    }

    public EnumDefinitionExtensionType getType() {
        return type;
    }

    public int size() {
        if (enumValues != null) {
            return enumValues.size();
        } else {
            return 0;
        }
    }

    public Collection<EnumValueDefinition> values() {
        if (enumValues != null) {
            return Collections.unmodifiableCollection(enumValues);
        } else {
            return Collections.emptyList();
        }
    }
}
